package com.xiaobias.a12;

import java.lang.reflect.Proxy;

public class JdkProxyDemo {

    interface Foo {
        void foo();
    }

    static final class Target implements Foo {

        @Override
        public void foo() {
            System.out.println("target foo");
        }
    }

    // jdk -- 只能接口代理
    // cglib
    public static void main(String[] args) throws Exception {
        // 目标对象
        Target target = new Target();

        // ClassLoader 用来加载
        ClassLoader loader = JdkProxyDemo.class.getClassLoader();
        Foo proxy = (Foo) Proxy.newProxyInstance(loader, new Class[]{Foo.class}, (p, method, args1) -> {
            System.out.println("before...");
            // 正常调用:  目标.方法(参数)
            // 代理调用： 方法.invoke(目标, 参数)
            Object result = method.invoke(target,  args);
            System.out.println("after...");
            return result;
        });
        proxy.foo();

        System.out.println(proxy.getClass());
        System.in.read();
    }
}